package br.ufpb.di.ppgi.negocio.servicos;

import java.util.ArrayList;
import java.util.List;

import br.com.caelum.vraptor.ioc.Component;
import br.ufpb.di.ppgi.negocio.iservicos.IAlunoService;
import br.ufpb.di.ppgi.negocio.modelo.aluno.Aluno;
import br.ufpb.di.ppgi.negocio.modelo.proposta.Proposta;
import br.ufpb.di.ppgi.persistencia.QueryLocator;
import br.ufpb.di.ppgi.persistencia.domainstore.DomainStore;
import br.ufpb.di.ppgi.persistencia.iquery.IAlunoQuery;
import br.ufpb.di.ppgi.persistencia.iquery.IPropostaQuery;
import br.ufpb.di.ppgi.persistencia.pagination.ListaPaginada;

@Component
public class AlunoService implements IAlunoService {

	private final IAlunoQuery alunoQuery;
	private final IPropostaQuery propostaQuery;
	private final DomainStore ds;
	
	public AlunoService(QueryLocator queries, DomainStore ds) {
		this.alunoQuery = queries.forAluno();
		this.propostaQuery = queries.forProposta();
		this.ds = ds;
	}

	@Override
	public void adicionar(Aluno aluno) {
		ds.add(aluno);

	}

	@Override
	public Aluno apagar(Long id) {
		return ds.remove(Aluno.class,id);
	}

	@Override
	public Aluno atualizar(Aluno aluno) {
		return ds.merge(aluno);
	}

	@Override
	public Aluno buscar(Long id) {
		return alunoQuery.get(id);
	}

	@Override
	public List<Aluno> listar() {
		return alunoQuery.listAll();
	}

	
	@Override
	public List<Aluno> listarMeusOrientandosQuePodemEnviarProposta(Long id) {
		List<Aluno> alunos = alunoQuery.listByOrientadorAndCanSendProposta(id);
		List<Aluno> alunosFiltrados = new ArrayList<Aluno>();
		
		for (Aluno aluno : alunos) {
			//System.out.println("buscando propostas de "+aluno);
			List<Proposta> propostas = propostaQuery.listByAlunoId(aluno.getId());
			boolean adiciona = true;
			
			for (Proposta proposta : propostas) {
				//System.out.println(aluno+" --> "+proposta);
				switch (proposta.getStatus()) {
					case APROVADO:
					case FINALIZADA:
					case HOMOLOGADO:
					case PENDENTE: adiciona = false;
								   break;
					
					case HOMOLOGACAO_REPROVADA:
					case REPROVADO: break;
				}
				
				if(!adiciona) {
					break;
				}
			}
			
			if(adiciona) {
				//System.out.println("adicionando "+aluno);
				alunosFiltrados.add(aluno);
			}
		}
		
		return alunosFiltrados;
	}

	@Override
	public boolean cpfJaExiste(String cpf) {
		return alunoQuery.cpfExists(cpf);
	}

	@Override
	public Aluno findByCPF(String cpf) {
		return alunoQuery.findByCPF(cpf);
	}
	
	@Override
	public ListaPaginada<Aluno> filtrarPaginando(String key, Integer page, String base) {
		return alunoQuery.paginarByKey(key)
			.query(10, page)
			.setBase(base)
			.toVersaoEmPortugues();
	}


	@Override
	public ListaPaginada<Aluno> filtrarPaginandoMeusOrientando(Long id,String key, Integer page, String base) {
		return alunoQuery.listByOrientador(id,key)
		.query(10, page)
		.setBase(base)
		.toVersaoEmPortugues();
	}
	
	
}
